home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / mark.c < prev    next >
C/C++ Source or Header  |  1993-02-07  |  5KB  |  229 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5.  
  6. /* マークを削除する */
  7. void
  8. mark_erase_mark(int mn)
  9. {
  10.     UBYTE l[VERY_LONG_LINE];
  11.     UNIT *wp;
  12.     int bp;
  13. /*ud("erase",mn,CURRENT_TEXT);*/
  14.     if (wp = mark_get_mark(mn,&bp)) {    /* 見つかった */
  15.         line_get_body(l,wp);
  16.         strcpy(&l[bp],&l[bp+2]);    /* 2バイト分つぶす */
  17.         line_store(wp,l);        /* エコーしない */
  18.         if (wp == CL) {
  19.             line_cl_cl();
  20.             work_line_analyze();
  21.         }
  22.     }
  23. }
  24.  
  25. /* 与えられた番号のマークを、現在のカーソル位置に設定する */
  26. void
  27. mark_set_mark(int mn)
  28. {
  29.     UBYTE l[VERY_LONG_LINE];
  30.     register int i;
  31.  
  32. /*ud("set",mn,CURRENT_TEXT);*/
  33. /*
  34. itoa(mn,l,16);
  35. under_print(l);binkey();
  36. */
  37.     mark_erase_mark(mn);
  38.     line_cl_strncpy(l,i = ANALYZE[CPX].BPOS);
  39.     l[i] = XCODE_UP;
  40.     l[i+1] = XCODE_MARK + mn;
  41.     l[i+2] = EOS;
  42.     line_cl_strcat(l,i);
  43.     line_store(CL,l);    /* エコーしない */
  44.     line_cl_cl();        /* CL_DATA も更新しておく */
  45.     work_line_analyze();
  46. }
  47.  
  48. /* 与えられた番号のマークのある行を返す */
  49. /* 無い場合は NIL を返す */
  50. /* バイト位置も返す */
  51. /* 見付けた場合、もしも他に XCODE があったなら勝手に「一番最初」に移動する */
  52. UNIT *
  53. mark_get_mark(int mn,int *bp)
  54. {
  55.     UNIT *wp;
  56.     UBYTE l[VERY_LONG_LINE],d[VERY_LONG_LINE];
  57.     register STR p;
  58.     register int bc,bc0,bct;
  59.     int dummy;
  60.  
  61. /*ud("get",mn,CURRENT_TEXT);*/
  62.     mn += XCODE_MARK;
  63.     for(wp = HEAD->ATO;wp != TAIL;wp = wp->ATO) {
  64.         line_get_body(l,wp);
  65.         p = l;
  66.         while(p = (STR) strchr(p,XCODE_UP)) {
  67.             if (p[1] == mn) {    /* 発見 */
  68.                 bct = p - l;    /* 取り合えずのバイトカウント */
  69.                 bc = 0;
  70.                 while(1) {
  71.                     /* 実体を越える */
  72.                     bc = line_touch_next_char_x(l,bc0 = bc,&dummy);
  73.                     if (bc > bct) {
  74.                         /* bc0 と bc でマークを挟んだ */
  75.                         if (bct == bc0) { /* マークが先頭だから何もしない */
  76.                             break;
  77.                         } else {
  78.                             strcpy(&l[bct],&l[bct+2]);
  79.                                 /* マークを潰す */
  80.                             strcpy(d,l);
  81.                             d[bc0] = XCODE_UP;
  82.                             d[bc0+1] = mn;
  83.                             strcpy(&d[bc0+2],&l[bc0]);
  84.                             line_store(wp,d);/* エコーしない */
  85.                             if (wp == CL) {
  86.                                 line_cl_cl();
  87.                                 work_line_analyze();
  88.                             }
  89.                             break;
  90.                         }
  91.                     } else {
  92. /*
  93. printf("[%d][%d]",bc,bct);binkey();
  94. */
  95.                     }
  96.                 }
  97.                 *bp = bc0;
  98.                 return(wp);
  99.             } else {
  100.                 p += 2;
  101.             }
  102.         }
  103.     }
  104.     return(NIL);
  105. }
  106.  
  107. /* 指定されたウインドウの */
  108. /* 与えられた番号のマークのある行を返す */
  109. /* 無い場合は NIL を返す */
  110. /* バイト位置も返す */
  111. UNIT *
  112. mark_get_mark_x(int w,int mn,int *bp)
  113. {
  114.     UNIT *wp;
  115.     UBYTE l[VERY_LONG_LINE];
  116.     STR p;
  117.     UNIT *X_HEAD,*X_TAIL;
  118.  
  119. /*ud("get_x",mn,CURRENT_TEXT);*/
  120.     X_HEAD = &TDATA[(WDATA[w].WTEXTS)].TEXT_HEADS;
  121.     X_TAIL = &TDATA[(WDATA[w].WTEXTS)].TEXT_TAILS;
  122.  
  123.     mn += XCODE_MARK;
  124.     for(wp = X_HEAD->ATO;wp != X_TAIL;wp = wp->ATO) {
  125.         line_get_body(l,wp);
  126.         p = l;
  127.         while(p = (STR) strchr(p,XCODE_UP)) {
  128.             if (p[1] == mn) {    /* 発見 */
  129.                 *bp = p - l;
  130.                 return(wp);
  131.             } else {
  132.                 p += 2;
  133.             }
  134.         }
  135.     }
  136.     return(NIL);
  137. }
  138.  
  139. /* 文字列の中にマークコードがあったなら対応するビットを立てて返す */
  140. /* 32ビットだよーん */
  141. UINT
  142. mark_find_mark(STR s)
  143. {
  144.     UINT mask = 0;
  145.     register STR p;
  146.  
  147.     p = s;
  148.     while(p = string_search_xcode(p)) {    /* 拡張コードがあった */
  149.         p++;    /* 次を指す */
  150.         if ((XCODE_MARK <= *p) && (*p <= (XCODE_MARKLAST))) {    /* マークだ */
  151.             mask |= (1 << (*p - XCODE_MARK));
  152.         }
  153.         p++;
  154.     }
  155.     return(mask);
  156. }
  157.  
  158. /* マスクに対応したマークを追加する */
  159. void
  160. mark_cat_mark_str(STR s,UINT mask)
  161. {
  162.     register UINT m = 1,bc = 0;
  163.     register int i;
  164.  
  165.     i = strlen(s);
  166.     for(;mask;m <<= 1,bc++) {
  167.         if (mask & m) {
  168.             mask ^= m;    /* ビットを倒す */
  169.             s[i++] = XCODE_UP;
  170.             s[i++] = XCODE_MARK + bc;
  171.         }
  172.     }
  173.     s[i] = EOS;
  174. }
  175.  
  176. /* システムマークを削除する */
  177. void
  178. mark_erase_mark_sys(int mn)
  179. {
  180.     UBYTE l[VERY_LONG_LINE];
  181.     UNIT *wp;
  182.     int bp;
  183.  
  184. /*ud("erase_sys",mn,CURRENT_TEXT);*/
  185.     if (wp = mark_get_mark_sys(mn,&bp)) {    /* 見つかった */
  186.         line_get_body(l,wp);
  187.         strcpy(&l[bp],&l[bp+2]);    /* 2バイト分つぶす */
  188.         line_store(wp,l);        /* エコーしない */
  189.         if (wp == CL) {
  190.             line_cl_cl();
  191.             work_line_analyze();
  192.         }
  193.     }
  194. }
  195.  
  196. /* 指定されたウインドウのシステムマークのある行を返す */
  197. /* 無い場合は NIL を返す */
  198. /* バイト位置も返す */
  199. UNIT *
  200. mark_get_mark_sys(int w,int *bp)
  201. {
  202.     UNIT *wp;
  203.     UBYTE l[VERY_LONG_LINE];
  204.     STR p;
  205.     UNIT *X_HEAD,*X_TAIL;
  206.     int mn;
  207.  
  208. /*ud("get_sys",mn,CURRENT_TEXT);*/
  209.     X_HEAD = &TDATA[(WDATA[w].WTEXTS)].TEXT_HEADS;
  210.     X_TAIL = &TDATA[(WDATA[w].WTEXTS)].TEXT_TAILS;
  211.  
  212.     mn = w + XCODE_SYSMARK;
  213.     for(wp = X_HEAD->ATO;wp != X_TAIL;wp = wp->ATO) {
  214.         line_get_body(l,wp);
  215.         p = l;
  216.         while(p = (STR) strchr(p,XCODE_UP)) {
  217.             if (p[1] == mn) {    /* 発見 */
  218.                 *bp = p - l;
  219.                 return(wp);
  220.             } else {
  221.                 p += 2;
  222.             }
  223.         }
  224.     }
  225.     return(NIL);
  226. }
  227.  
  228.  
  229.